/*
类的内部成员的外部可访问性，由三个可访问性修饰符（access modifiers）控制：`public`、`private`和`protected`
这三个修饰符的位置，都写在属性或方法的最前面
*/


/* public修饰符表示这是公开成员，外部可以自由访问 */
class Greeter {
    public greet() {
        console.log("hi!");
    }
}

const g = new Greeter();
g.greet();




/* private修饰符表示私有成员，只能用在当前类的内部，类的实例和子类都不能使用该成员 */
class A {
    private x = 10;
    f(obj: A) {
        // 在类A内部，A的实例对象可以获取私有成员x。   
        console.log(obj.x);
    }
}
const a = new A();
a.f(a);



/* protected修饰符表示该成员是保护成员，只能在类的内部使用该成员，实例无法使用该成员，但是子类内部可以使用 */

class D {
    protected x = 1;
}

class Q extends D {
    x = 2;
}




/*类的内部可以使用`static`关键字，定义静态成员。静态成员是只能通过类本身使用的成员，不能通过实例对象使用*/
class MyClass {
    static x = 0;
    static printX() {
        console.log(MyClass.x);
    }
}

MyClass.x;
MyClass.printX(); 